package com.evan.review.lifecycle;

/**
 * Activity生命周期详解及面试要点
 *
 * 一、基础生命周期方法
 *
 * 1. onCreate()
 *    - 作用：Activity被创建时调用，用于完成初始化工作
 *    - 执行时机：当Activity第一次创建时调用
 *    - 常见操作：设置布局、初始化成员变量、绑定数据、注册广播等
 *    - 注意事项：此时Activity还不可见，不应执行耗时操作
 *
 * 2. onStart()
 *    - 作用：Activity即将变为可见时调用
 *    - 执行时机：onCreate()之后或onRestart()之后
 *    - 常见操作：启动UI更新的线程、注册需要UI可见时的监听器等
 *    - 注意事项：此时Activity可见但不可交互
 * 
 * 3. onResume()
 *    - 作用：Activity获取焦点，处于前台可交互状态
 *    - 执行时机：onStart()之后，或其他Activity覆盖当前Activity后返回时
 *    - 常见操作：启动动画、获取独占资源、启动需要前台可见的功能（如相机）
 *    - 注意事项：此时Activity完全可见且可交互
 * 
 * 4. onPause()
 *    - 作用：Activity失去焦点，但仍然可见
 *    - 执行时机：当系统即将启动或恢复另一个Activity时
 *    - 常见操作：保存未保存的数据、停止动画、释放系统资源、保存持久化数据
 *    - 注意事项：必须执行迅速，不能执行耗时操作，下一个Activity的onResume()必须等待此方法完成
 * 
 * 5. onStop()
 *    - 作用：Activity完全不可见时调用
 *    - 执行时机：另一个Activity覆盖当前Activity后，或Activity被销毁前
 *    - 常见操作：停止不必要的资源消耗，如注销广播接收器、停止服务等
 *    - 注意事项：在此阶段Activity实例仍然存在，但可能被系统杀死
 * 
 * 6. onRestart()
 *    - 作用：Activity从停止状态重新启动
 *    - 执行时机：Activity从不可见变为可见时（从onStop()状态恢复）
 *    - 常见操作：恢复onStop()中释放的资源
 *    - 注意事项：比较少用，通常可在onStart()中处理
 * 
 * 7. onDestroy()
 *    - 作用：Activity被销毁前调用，用于最终清理
 *    - 执行时机：Activity结束（用户关闭或调用finish()）或系统为节省空间临时销毁Activity
 *    - 常见操作：释放所有资源、取消网络连接、解注册监听器、销毁对象等
 *    - 注意事项：系统可能在内存不足时直接杀死进程，不保证一定会调用此方法
 *
 * 二、完整生命周期执行顺序
 *
 * 1. 完整生命周期（从创建到销毁）
 *    onCreate() -> onStart() -> onResume() -> [Activity运行中] -> onPause() -> onStop() -> onDestroy()
 *
 * 2. Activity被其他Activity覆盖（部分遮挡）
 *    onPause() [前一Activity] -> onCreate() -> onStart() -> onResume() [后一Activity]
 *
 * 3. Activity完全被其他Activity覆盖
 *    onPause() -> onStop() [前一Activity] -> onCreate() -> onStart() -> onResume() [后一Activity]
 *
 * 4. 用户返回到之前的Activity
 *    onPause() [当前Activity] -> onRestart() -> onStart() -> onResume() [之前的Activity] -> onStop() -> onDestroy() [当前Activity]
 *
 * 5. 屏幕旋转或配置变更
 *    onPause() -> onStop() -> onSaveInstanceState() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
 *
 * 三、额外的生命周期方法
 *
 * 1. onSaveInstanceState()
 *    - 作用：保存Activity的瞬态数据
 *    - 执行时机：在Activity可能被系统销毁之前，通常在onStop()之后，但不保证
 *    - 常见操作：保存临时状态数据到Bundle中，如UI状态、用户输入等
 *    - 注意事项：与onPause()不同，此方法仅在系统主动销毁Activity时调用，如屏幕旋转或内存不足
 *
 * 2. onRestoreInstanceState()
 *    - 作用：恢复之前保存的状态
 *    - 执行时机：在onStart()之后，onResume()之前调用
 *    - 常见操作：从Bundle中恢复之前保存的UI状态或临时数据
 *    - 注意事项：只有在savedInstanceState不为null时才会被调用（即确实有状态需要恢复时）
 *
 * 3. onConfigurationChanged()
 *    - 作用：处理配置变更，避免Activity重建
 *    - 执行时机：配置变更发生且在Manifest中声明了该配置处理时
 *    - 常见操作：根据新配置调整UI布局或资源
 *    - 注意事项：需在AndroidManifest中配置android:configChanges属性，常见值如"orientation|screenSize|keyboardHidden"
 *
 * 4. onNewIntent()
 *    - 作用：当Activity的启动模式为singleTop/singleTask/singleInstance且实例已存在时调用
 *    - 执行时机：已存在的Activity实例被复用时
 *    - 常见操作：处理新的Intent数据，更新UI或内部状态
 *    - 注意事项：复用的Activity生命周期方法不会重新执行，只会调用onNewIntent()和onResume()
 *
 * 5. onUserLeaveHint()
 *    - 作用：当用户主动离开Activity时调用（如按Home键）
 *    - 执行时机：在onPause()之前调用
 *    - 常见操作：用于区分是用户主动离开还是系统原因导致Activity暂停
 *    - 注意事项：如果是系统因素导致Activity暂停，则不会调用此方法
 *
 * 6. onWindowFocusChanged()
 *    - 作用：当Activity窗口获得或失去焦点时调用
 *    - 执行时机：Activity窗口与用户可交互或不可交互时
 *    - 常见操作：调整动画、游戏暂停/恢复等需要精确控制可见性的场景
 *    - 注意事项：可能会被调用多次，需根据传入的hasFocus参数判断
 *
 * 四、配置变更处理方式
 *
 * 1. 默认重建方式
 *    - 原理：系统销毁当前Activity并重新创建一个新的实例
 *    - 流程：完整生命周期，但会调用onSaveInstanceState()和onRestoreInstanceState()
 *    - 适用场景：大多数简单应用，依赖系统自动恢复
 *    - 注意事项：需妥善保存和恢复非自动保存的数据，如网络请求结果
 *
 * 2. 使用onConfigurationChanged()处理
 *    - 原理：通过在manifest声明configChanges，阻止Activity重建
 *    - 流程：仅调用onConfigurationChanged()，其他生命周期方法不调用
 *    - 适用场景：需要对特定配置变更做精细处理，避免重建开销大的场景
 *    - 注意事项：需自行处理所有与配置相关的资源更新，如布局适配等
 *
 * 3. 使用ViewModel保存数据
 *    - 原理：利用架构组件ViewModel，其生命周期独立于Activity配置变更
 *    - 流程：Activity重建，但ViewModel实例保留
 *    - 适用场景：存储UI相关数据，避免在配置变更时丢失
 *    - 注意事项：ViewModel仅在Activity真正结束时才会清除，在配置变更时会保留
 *
 * 4. 使用onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()（已过时）
 *    - 原理：保存对象引用，使其在配置变更时不被销毁
 *    - 注意事项：此方法已被ViewModel替代，不推荐使用
 *
 * 五、Activity生命周期相关面试题
 *
 * 1. 请详细描述Activity的生命周期？
 *    答：Activity生命周期主要包括七个方法：onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestroy()。
 *        它们的执行顺序为：[上述基础生命周期执行顺序的详细描述]
 *
 * 2. onPause()和onStop()有什么区别？
 *    答：(1) 调用时机不同：onPause()在Activity部分不可见或失去焦点时调用，而onStop()在Activity完全不可见时调用
 *        (2) 可见性不同：onPause()后Activity可能仍然部分可见，而onStop()后Activity完全不可见
 *        (3) 使用场景不同：onPause()适合保存关键数据、释放独占资源等必须立即执行的操作；onStop()适合停止刷新UI、释放重量级资源等操作
 *        (4) 执行时间限制：onPause()必须快速执行，因为下一个Activity的onResume()必须等它完成；onStop()则没有这种限制
 *
 * 3. 为什么不能在onPause()中执行耗时操作？
 *    答：因为下一个Activity的onResume()必须等待当前Activity的onPause()执行完成才能继续。如果在onPause()中执行耗时操作，
 *        会导致应用切换卡顿，影响用户体验。耗时操作应放在onStop()中处理。
 *
 * 4. 如何在屏幕旋转时保存和恢复数据？
 *    答：有多种方式：
 *        (1) 使用onSaveInstanceState()和onRestoreInstanceState()保存和恢复数据
 *        (2) 在AndroidManifest.xml中为Activity配置android:configChanges属性，处理配置变更避免重建
 *        (3) 使用ViewModel组件，它在配置变更时会保留数据，而在Activity真正结束时才销毁
 *        (4) 使用持久化存储，如SharedPreferences、数据库等
 *
 * 5. 屏幕旋转时Activity的生命周期是怎样的？
 *    答：默认情况下，屏幕旋转会导致Activity销毁并重建，生命周期顺序为：
 *        onPause() -> onStop() -> onSaveInstanceState() -> onDestroy() -> 
 *        onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
 *        如果在AndroidManifest中配置了处理屏幕旋转的configChanges，则只会调用onConfigurationChanged()方法，不会重建Activity。
 *
 * 6. onSaveInstanceState()和onPause()有什么区别？
 *    答：(1) 调用时机不同：onPause()在Activity不处于前台时必定调用，而onSaveInstanceState()只在Activity可能被系统销毁时才调用
 *        (2) 使用场景不同：onPause()用于保存持久性数据和释放资源，onSaveInstanceState()用于保存UI临时状态
 *        (3) 保证性不同：onPause()一定会被调用，而onSaveInstanceState()不保证一定调用（如用户按返回键主动销毁Activity）
 *
 * 7. 什么情况下Activity不会调用onSaveInstanceState()？
 *    答：当用户主动销毁Activity时（如按返回键），系统认为用户不需要保存状态，因此不会调用onSaveInstanceState()。
 *        只有当系统因配置变更或内存不足等原因主动销毁Activity时，才会调用此方法。
 *
 * 8. 在后台时，Activity可能被系统回收，如何判断Activity是新建还是从被回收状态恢复？
 *    答：通过onCreate()方法的savedInstanceState参数判断。如果该参数为null，说明Activity是新创建的；
 *        如果不为null，说明Activity是从被回收状态恢复的，可以从中获取之前保存的状态数据。
 *
 * 9. Dialog弹出时Activity的生命周期会如何变化？
 *    答：普通Dialog或AlertDialog弹出时，Activity生命周期不会发生变化；
 *        如果是全屏DialogActivity或透明Activity，则会导致底层Activity调用onPause()，但不会调用onStop()，
 *        因为Activity仍然部分可见。
 *
 * 10. 前台Activity与后台Activity的区别？
 *     答：(1) 生命周期状态不同：前台Activity处于Resumed状态，后台Activity处于Stopped状态
 *         (2) 优先级不同：前台Activity优先级最高，很少被系统杀死；后台Activity优先级较低，内存不足时可能被回收
 *         (3) 可见性不同：前台Activity完全可见并可交互，后台Activity不可见
 *         (4) 资源占用限制不同：从Android 9开始，系统对后台Activity有更多限制，如网络、CPU等资源使用限制
 *
 * 11. ViewPager中的Fragment生命周期与Activity生命周期有何不同？
 *     答：(1) ViewPager会预加载相邻页面的Fragment，这些Fragment会执行到onResume()，但实际并不可见
 *         (2) Fragment额外有onAttach()、onCreateView()、onActivityCreated()、onDestroyView()等生命周期方法
 *         (3) Fragment的生命周期受宿主Activity控制，Activity销毁时，其中所有Fragment也会销毁
 *         (4) 使用FragmentPagerAdapter时，切换页面会调用onPause()/onResume()，而不会销毁Fragment
 *
 * 12. Activity A启动Activity B，然后按Home键，再回到应用，生命周期执行顺序是什么？
 *     答：A启动B的顺序：A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()
 *         按Home键后的顺序：B.onPause() -> B.onStop() -> A.onStop()
 *         从最近任务列表返回的顺序：B.onRestart() -> B.onStart() -> B.onResume()
 *
 * 13. 如何保证在系统配置变化时（如屏幕旋转）Activity不重新创建？
 *     答：在AndroidManifest.xml中为对应Activity添加android:configChanges属性：
 *         android:configChanges="orientation|screenSize|keyboardHidden"
 *         这样在配置变更时，系统不会重建Activity，而是调用onConfigurationChanged()方法。
 *
 * 14. 当前Activity崩溃时的生命周期顺序是怎样的？
 *     答：当Activity因未捕获异常崩溃时，会先调用onPause()和onStop()，然后调用onDestroy()，
 *         随后系统可能会尝试重启应用或显示应用已停止运行的提示。但由于崩溃是非正常情况，
 *         不保证生命周期方法都能完整执行。
 */
public class LifecycleDoc {
    // 这是一个文档类，只包含注释，没有实际代码
} 